import request from '@/utils/request';
import qs from 'qs';
import type { PageResult, ResponseData } from '../typing';
// 响应接口
export interface GetMenuListRes {
    code: number;
    data: {
        // 菜单编号 */
        id: number;
        // 创建时间 */
        createTime: Record<string, unknown>;
        // 菜单名称 */
        name: string;
        // 权限标识,仅菜单类型为按钮时，才需要传递 */
        permission: string;
        // 类型，参见 MenuTypeEnum 枚举类 */
        type: number;
        // 显示顺序不能为空 */
        sort: number;
        // 父菜单 ID */
        parentId: number;
        // 路由地址,仅菜单类型为菜单或者目录时，才需要传 */
        path: string;
        // 菜单图标,仅菜单类型为菜单或者目录时，才需要传 */
        icon: string;
        // 组件路径,仅菜单类型为菜单时，才需要传 */
        component: string;
        // 组件名 */
        componentName: string;
        // 状态,见 CommonStatusEnum 枚举 */
        status: number;
        // 是否可见 */
        visible: number;
        // 是否缓存 */
        keepAlive: number;
        // 是否总是显示 */
        alwaysShow: number;
    }[];
    msg: string;
}
export interface QueryMenuParams {
    name?: string;
    status?: string;
}
/**
 * 获取菜单列表
 * @param {string} reqVO 管理后台 - 菜单列表 Request VO
 * @returns
 */
export function getMenuList(reqVO: QueryMenuParams): Promise<GetMenuListRes> {
    return request.get(`/system/menu/list?${qs.stringify(reqVO)}`);
}
// 参数接口
export interface CreateMenuParams {
    // 菜单名称 */
    name: string;
    // 权限标识,仅菜单类型为按钮时，才需要传递 */
    permission?: string;
    // 类型，参见 MenuTypeEnum 枚举类 */
    type: number;
    // 显示顺序不能为空 */
    sort: number;
    // 父菜单 ID */
    parentId: number;
    // 路由地址,仅菜单类型为菜单或者目录时，才需要传 */
    path?: string;
    // 菜单图标,仅菜单类型为菜单或者目录时，才需要传 */
    icon?: string;
    // 组件路径,仅菜单类型为菜单时，才需要传 */
    component?: string;
    // 组件名 */
    componentName?: string;
    // 状态,见 CommonStatusEnum 枚举 */
    status: number;
    // 是否可见 */
    visible?: number;
    // 是否缓存 */
    keepAlive?: number;
    // 是否总是显示 */
    alwaysShow?: number;
    menuType: number;
}
/**
 * 创建菜单
 * @param {object} params 管理后台 - 菜单权限创建 Request VO
 * @param {string} params.name 菜单名称
 * @param {string} params.permission 权限标识,仅菜单类型为按钮时，才需要传递
 * @param {number} params.type 类型，参见 MenuTypeEnum 枚举类
 * @param {number} params.sort 显示顺序不能为空
 * @param {number} params.parentId 父菜单 ID
 * @param {string} params.path 路由地址,仅菜单类型为菜单或者目录时，才需要传
 * @param {string} params.icon 菜单图标,仅菜单类型为菜单或者目录时，才需要传
 * @param {string} params.component 组件路径,仅菜单类型为菜单时，才需要传
 * @param {string} params.componentName 组件名
 * @param {number} params.status 状态,见 CommonStatusEnum 枚举
 * @param {number} params.visible 是否可见
 * @param {number} params.keepAlive 是否缓存
 * @param {number} params.alwaysShow 是否总是显示
 * @returns
 */
export function createMenu(params: CreateMenuParams): Promise<ResponseData<boolean>> {
    return request.post(`/system/menu/create`, params);
}
// 参数接口
export interface UpdateMenuParams {
    // 菜单名称 */
    name: string;
    // 权限标识,仅菜单类型为按钮时，才需要传递 */
    permission?: string;
    // 类型，参见 MenuTypeEnum 枚举类 */
    type: number;
    // 显示顺序不能为空 */
    sort: number;
    // 父菜单 ID */
    parentId: number;
    // 路由地址,仅菜单类型为菜单或者目录时，才需要传 */
    path?: string;
    // 菜单图标,仅菜单类型为菜单或者目录时，才需要传 */
    icon?: string;
    // 组件路径,仅菜单类型为菜单时，才需要传 */
    component?: string;
    // 组件名 */
    componentName?: string;
    // 状态,见 CommonStatusEnum 枚举 */
    status: number;
    // 是否可见 */
    visible?: number;
    // 是否缓存 */
    keepAlive?: number;
    // 是否总是显示 */
    alwaysShow?: number;
    // 菜单ID */
    id: number;
}
/**
 * 修改菜单
 * @param {object} params 管理后台 - 菜单权限更新 Request VO
 * @param {string} params.name 菜单名称
 * @param {string} params.permission 权限标识,仅菜单类型为按钮时，才需要传递
 * @param {number} params.type 类型，参见 MenuTypeEnum 枚举类
 * @param {number} params.sort 显示顺序不能为空
 * @param {number} params.parentId 父菜单 ID
 * @param {string} params.path 路由地址,仅菜单类型为菜单或者目录时，才需要传
 * @param {string} params.icon 菜单图标,仅菜单类型为菜单或者目录时，才需要传
 * @param {string} params.component 组件路径,仅菜单类型为菜单时，才需要传
 * @param {string} params.componentName 组件名
 * @param {number} params.status 状态,见 CommonStatusEnum 枚举
 * @param {number} params.visible 是否可见
 * @param {number} params.keepAlive 是否缓存
 * @param {number} params.alwaysShow 是否总是显示
 * @param {number} params.id 菜单ID
 * @returns
 */
export function updateMenu(params: UpdateMenuParams): Promise<ResponseData<boolean>> {
    return request.put(`/system/menu/update`, params);
}
/**
 * 删除菜单
 * @param {string} id 角色编号
 * @returns
 */
export function deleteMenu(id: number): Promise<ResponseData<boolean>> {
    return request.delete(`/system/menu/delete?id=${id}`);
}
// 响应接口
export interface GetMenuRes {
    code: number;
    data: {
        // 菜单编号 */
        id: number;
        // 创建时间 */
        createTime: Record<string, unknown>;
        // 菜单名称 */
        name: string;
        // 权限标识,仅菜单类型为按钮时，才需要传递 */
        permission: string;
        // 类型，参见 MenuTypeEnum 枚举类 */
        type: number;
        // 显示顺序不能为空 */
        sort: number;
        // 父菜单 ID */
        parentId: number;
        // 路由地址,仅菜单类型为菜单或者目录时，才需要传 */
        path: string;
        // 菜单图标,仅菜单类型为菜单或者目录时，才需要传 */
        icon: string;
        // 组件路径,仅菜单类型为菜单时，才需要传 */
        component: string;
        // 组件名 */
        componentName: string;
        // 状态,见 CommonStatusEnum 枚举 */
        status: number;
        // 是否可见 */
        visible: number;
        // 是否缓存 */
        keepAlive: number;
        // 是否总是显示 */
        alwaysShow: number;
    };
    msg: string;
}
/**
 * 获取菜单信息
 * @param {string} id
 * @returns
 */
export function getMenu(id: number): Promise<GetMenuRes> {
    return request.get(`/system/menu/get?id=${id}`);
}
export function queryMenuTree(): Promise<any> {
    return request.get(`/system/menu/list-all-simple`);
}
// 响应接口
export interface GetMenuListRes {
    code: number;
    data: {
        // 菜单名称 */
        id: number;
        // 父菜单 ID */
        parentId: number;
        // 菜单名称 */
        name: string;
        // 路由地址,仅菜单类型为菜单或者目录时，才需要传 */
        path: string;
        // 组件路径,仅菜单类型为菜单时，才需要传 */
        component: string;
        // 组件名 */
        componentName: string;
        // 菜单图标,仅菜单类型为菜单或者目录时，才需要传 */
        icon: string;
        // 是否可见 */
        visible: number;
        // 是否缓存 */
        keepAlive: number;
        // 是否总是显示 */
        alwaysShow: number;
        // 显示顺序 */
        sort: number;
    }[];
    msg: string;
}
export interface QueryMenuTreeParams {
    menuType: string;
    name?: string;
    status?: string;
}
/**
 * 获取菜单列表
 * @param {string} name 菜单名称，模糊匹配
 * @param {string} status 展示状态，参见 CommonStatusEnum 枚举类
 * @param {string} menuType 菜单类型:0->后台,1->app
 * @returns
 */
export function getMenuListTree(params: QueryMenuTreeParams): Promise<GetMenuListRes> {
    return request.get(`/system/menu/list?${qs.stringify(params)}`);
}
